코딩테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 스쿨

[ 템플릿 코드 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(string s) {
    int answer = 0;
    return answer;
}

[ 풀이 ]

#include <string>
using namespace std;
 
int solution(string s)
{
    string answer = "";
    string temp = "";
 
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            answer += s[i];
        }
        else
        {
            temp += s[i];
 
            if (temp == "zero")
            {
                answer += '0';
                temp = "";
            }
            else if (temp == "one")
            {
                answer += '1';
                temp = "";
            }
            else if (temp == "two")
            {
                answer += '2';
                temp = "";
            }
            else if (temp == "three")
            {
                answer += '3';
                temp = "";
            }
            else if (temp == "four")
            {
                answer += '4';
                temp = "";
            }
            else if (temp == "five")
            {
                answer += '5';
                temp = "";
            }
            else if (temp == "six")
            {
                answer += '6';
                temp = "";
            }
            else if (temp == "seven")
            {
                answer += '7';
                temp = "";
            }
            else if (temp == "eight")
            {
                answer += '8';
                temp = "";
            }
            else if (temp == "nine")
            {
                answer += '9';
                temp = "";
            }
        }
    }
 
    return stoi(answer);
}

[ 해설 ]

#include <string>      // string 클래스와 stoi() 함수를 사용하기 위한 헤더
using namespace std;   // std::를 생략하기 위해 사용
 
// 문자열 s를 받아 원래의 숫자로 변환하는 함수
int solution(string s)
{
    // 최종적으로 숫자만 저장될 문자열
    // 예) "one4seveneight" -> "1478"
    string answer = "";
 
    // 영단어를 한 글자씩 모아둘 임시 문자열
    // 예) "o" -> "on" -> "one"
    string temp = "";
 
    // 문자열의 처음부터 끝까지 한 글자씩 확인
    for (int i = 0; i < s.size(); i++)
    {
        // 현재 문자가 숫자인지 확인
        // 문자 '0' ~ '9'의 아스키코드를 이용한 비교
        if (s[i] >= '0' && s[i] <= '9')
        {
            // 숫자라면 그대로 결과 문자열에 추가
            // 예)
            // answer = "14"
            // s[i] = '5'
            // 결과 -> "145"
            answer += s[i];
        }
        // 숫자가 아니라면 영어 문자
        else
        {
            // 현재 문자를 temp 문자열 뒤에 추가
            // 예)
            // temp = "o"
            // temp = "on"
            // temp = "one"
            temp += s[i];
 
            // temp가 "zero"가 되면
            if (temp == "zero")
            {
                // 결과 문자열에 숫자 0 추가
                answer += '0';
 
                // 다음 영단어를 저장하기 위해 temp 초기화
                temp = "";
            }
 
            // temp가 "one"이 되면
            else if (temp == "one")
            {
                // 숫자 1 추가
                answer += '1';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "two"가 되면
            else if (temp == "two")
            {
                // 숫자 2 추가
                answer += '2';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "three"가 되면
            else if (temp == "three")
            {
                // 숫자 3 추가
                answer += '3';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "four"가 되면
            else if (temp == "four")
            {
                // 숫자 4 추가
                answer += '4';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "five"가 되면
            else if (temp == "five")
            {
                // 숫자 5 추가
                answer += '5';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "six"가 되면
            else if (temp == "six")
            {
                // 숫자 6 추가
                answer += '6';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "seven"가 되면
            else if (temp == "seven")
            {
                // 숫자 7 추가
                answer += '7';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "eight"가 되면
            else if (temp == "eight")
            {
                // 숫자 8 추가
                answer += '8';
 
                // temp 비우기
                temp = "";
            }
 
            // temp가 "nine"가 되면
            else if (temp == "nine")
            {
                // 숫자 9 추가
                answer += '9';
 
                // temp 비우기
                temp = "";
            }
        }
    }
 
    // answer에는 숫자로만 이루어진 문자열이 저장되어 있다.
    // 예) "1478"
    // stoi()를 이용하여 문자열을 정수(int)로 변환한 후 반환한다.
    return stoi(answer);
}

[ 타 답안 ]

#include <string>
using namespace std;
 
int solution(string s) {
 
    // 숫자에 해당하는 영단어
    string words[10] =
    {
        "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine"
    };
 
    // 0부터 9까지 반복
    for (int i = 0; i < 10; i++)
    {
        // 영단어가 존재하는 동안 계속 찾기
        while (s.find(words[i]) != string::npos)
        {
            // 찾은 위치의 영단어를 숫자로 변경
            s.replace(s.find(words[i]), words[i].length(), to_string(i));
        }
    }
 
    // 문자열을 정수로 변환하여 반환
    return stoi(s);
}

C++ CodingTest